//未完成
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 500005; // 假设最大用户数为 500,005
int parent[MAX_N];
int size[MAX_N];
int friends[MAX_N]; // 修改：使用位运算来存储好友关系

vector<long long> total_photos(MAX_N, 0);

int find(int x) {
  if (parent[x] != x) {
    parent[x] = find(parent[x]);
  }
  return parent[x];
}

void unite(int x, int y) {
  int rx = find(x), ry = find(y);
  if (rx != ry) {
    parent[rx] = ry;
    size[ry] += size[rx];
    total_photos[ry] += total_photos[rx];
  }
}

void removeFriend(int x, int y) {
  friends[x] &= ~(1 << y); // 使用位运算取消好友关系
  friends[y] &= ~(1 << x);
}

int main() {
  int n, m;
  cin >> n >> m;

  for (int i = 0; i < n; i++) {
    parent[i] = i;
    size[i] = 1;
    friends[i] = 0; // 初始化好友关系
    // photos[i] 和 total_photos[i] 已经在声明时被初始化为0，这里不需要再设置
  }

  for (int i = 0; i < m; i++) {
    char op;
    cin >> op;

    if (op == '+') {
      int x, y;
      cin >> x >> y;
      x--;
      y--;
      if (!(friends[x] & (1 << y))) {
        unite(x, y);
        friends[x] |= (1 << y); // 使用位运算设置好友关系
        friends[y] |= (1 << x);
      }
    } else if (op == '-') {
      int x, y;
      cin >> x >> y;
      x--;
      y--;
      if (friends[x] & (1 << y)) {
        removeFriend(x, y); // 使用新的函数取消好友关系
      }
    } else if (op == '!') { // 新增：处理照片发送操作
      int x;
      cin >> x;
      x--;
      int root = find(x);
      total_photos[root]++; // 增加该集合的照片数量
    }
  }

  // 输出每个用户收到的照片数量
  for (int i = 0; i < n; i++) {
    int root = find(i);
    cout << total_photos[root] << " ";
  }
  cout << endl;

  return 0;
}
